/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: fzykd
 * Date: 2022-09-28
 * Time: 16:30
 */

//懒汉模式
class Singleton1 {
    //懒汉模式 不急这new对象 在需要的时候才使用
    private static Singleton1 instance = null;
    //同样写一个private的构造方法
    private Singleton1(){}
    //写一个类外能拿到的方法
    public static Singleton1 getInstance(){
        //1.首先判断时候已经有了唯一实例

        //一、其次这里存在线程安全问题  这里的读和修改不是原子性的 当多个线程同时对这里进行修改时
        //存在线程安全问题  解决办法 加锁
       if (instance == null){
           //三、当多个线程去调用getInstance 肯能会触发内存可见性问题
           //当编译器优化之后 那么修改操作无法获取 最后引起第一个if的失效 不会影响第二层的判定
           //解决办法 给instance加上volatile 静止编译器优化 保证内存可见性
           synchronized (Singleton1.class){
               //二、加锁之后 新的问题是 每次调用getInstance都会进行加锁 那么速度就慢了 存在锁竞争
               //那么在来一个判断 是否需要加锁 如果已经有了实例 那么直接返回null
               if(instance == null){
                   return new Singleton1();
               }
           }
       }
        return null;
    }
}


//单例模式 - 懒汉模式
public class Demo2 {
    public static void main(String[] args) {
        Singleton1 instance =Singleton1.getInstance();
    }
}
